package bdcin.repositorios;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.classic.Session;
import org.hibernate.criterion.Restrictions;

import bdcin.classesbasicas.DocenteUtilizado;
import bdcin.excecoes.BuscarException;
import bdcin.excecoes.EditarException;
import bdcin.excecoes.InserirException;
import bdcin.excecoes.RemoverException;


public class RepositorioDocenteUtilizado {
	
	private SessionFactory factory;
	
	
	public RepositorioDocenteUtilizado() {
		this.factory = ConfiguracaoBD.getFactory();
	}
	
	
	public void inserir(DocenteUtilizado docenteUtilizado) throws InserirException {
		if(docenteUtilizado != null) {
			Session session = null;
			Transaction transaction = null;
			
			try {				
				session = this.factory.openSession();
				transaction = session.beginTransaction();
				session.save(docenteUtilizado);
				transaction.commit();
					
			}catch(Exception e) {
				if(transaction != null) {
					transaction.rollback();
				}
				e.printStackTrace();
				throw new InserirException("Erro ao inserir DocenteUtilizado!");
				
			}finally {
				if(session != null) {
					session.close();
				}
			}
		}
	}
	
	public void remover(Long id) throws RemoverException{
		DocenteUtilizado DocenteUtilizado;
		try {
			DocenteUtilizado = this.buscar(id);
		} catch (BuscarException e1) {
			throw new RemoverException("Erro ao remover o DocenteUtilizado.");
		}
		if(DocenteUtilizado != null){
			
			Session session = null;
			Transaction transaction = null;
			
			try {				
				session = this.factory.openSession();
				transaction = session.beginTransaction();
				session.delete(DocenteUtilizado);
				transaction.commit();
					
			}catch(Exception e) {
				if(transaction != null) {
					transaction.rollback();
				}
				e.printStackTrace();
				throw new RemoverException("Erro ao remover o DocenteUtilizado.");
				
			}finally {
				if(session != null) {
					session.close();
				}
			}
		}
	}
	

	public void alterar(DocenteUtilizado docenteUtilizado) throws EditarException{
		
		if(docenteUtilizado != null){
			
			Session session = null;
			Transaction transaction = null;
			
			try {				
				session = this.factory.openSession();
				transaction = session.beginTransaction();
				session.update(docenteUtilizado);
				transaction.commit();
					
			}catch(Exception e) {
				if(transaction != null) {
					transaction.rollback();
				}
				e.printStackTrace();
				throw new EditarException("Erro ao atualizar o DocenteUtilizado!");
				
			}finally {
				if(session != null) {
					session.close();
				}
			}
		}
	}
	
	
	public DocenteUtilizado buscar(Long id) throws BuscarException{
		DocenteUtilizado DocenteUtilizado = null;
		if(id != null){			
			Session session = null;						
			try {				
				session = this.factory.openSession();				
				DocenteUtilizado = (DocenteUtilizado)session.get(DocenteUtilizado.class, id);				
					
			}catch(Exception e) {
				e.printStackTrace();
				throw new BuscarException("Erro ao buscar o DocenteUtilizado!");
				
			}finally {
				if(session != null) {
					session.close();
				}
			}
		}
		return DocenteUtilizado;
	}
	
		
	
	@SuppressWarnings("unchecked")
	public DocenteUtilizado buscaDocenteUtilizadoPorDocente(Long id) throws BuscarException{
		List<DocenteUtilizado> docentes = null;
		DocenteUtilizado docenteUtilizado = null;
		if(id != null){			
			Session session = null;
			Criteria criteria = null;
			try {				
				session = this.factory.openSession();				
				criteria = session.createCriteria(DocenteUtilizado.class);	
				criteria.add(Restrictions.eq("docente.id",  id));
				docentes = criteria.list();
					
			}catch(Exception e) {
				e.printStackTrace();
				throw new BuscarException("Erro ao buscar o DocenteUtilizado por Docente!");
				//throw new RuntimeException("Erro ao buscar o Docente por nome: " + e.getMessage());
				
			}finally {
				if(session != null) {
					session.close();
				}
			}
			
			if(docentes != null && docentes.size() > 0) {
				docenteUtilizado = docentes.get(0);
			}
		}
		
		return docenteUtilizado;
	}
	
	@SuppressWarnings("unchecked")
	public List<DocenteUtilizado> listarDocentesUtilizados() throws BuscarException{
		List<DocenteUtilizado> docentesUtilizado = null;		
		
			Session session = null;
			Criteria criteria = null;
			try {				
				session = this.factory.openSession();				
				criteria = session.createCriteria(DocenteUtilizado.class);	
				docentesUtilizado = criteria.list();
					
			}catch(Exception e) {
				e.printStackTrace();
				throw new BuscarException("Erro ao listar DocentesUtilizados!");
				//throw new RuntimeException("Erro ao buscar o Docente por nome: " + e.getMessage());
				
			}finally {
				if(session != null) {
					session.close();
				}
			}
		
		return docentesUtilizado;
	}
	
	

}
